#include <iostream>

/**
 * C++ 接口（抽象类）
 *
 * C++ 接口是使用抽象类来实现的，抽象类与数据抽象互不混淆，数据抽象是一个把实现细节与相关的数据分离开的概念。
 *
 * 有一个纯虚函数 (=0)的类为抽象类
 *
 */

//基类
class Shape{
protected:
    int width;
    int height;
public:
    //提供纯虚函数
    virtual int getArea() = 0;

    void setWidth(int width){
        this->width = width;
    }

    void setHeight(int height){
        this->height = height;
    }
};

//矩形派生类
class Rectangle : public Shape{
public:
    int getArea() override{
        return width * height;
    }
};

//三角形派生类
class Triangle : public Shape{
public:
    int getArea() override{
        return (width * height) / 2;
    }
};

int main() {

    Rectangle rectangle;
    Triangle triangle;

    rectangle.setWidth(5);
    rectangle.setHeight(7);

    std::cout << "Total Rectangle area: " << rectangle.getArea() << std::endl;

    triangle.setWidth(20);
    triangle.setHeight(35);

    std::cout << "Triangle area : " << triangle.getArea() << std::endl;

    return 0;
}
